package com.mqtt.nettymqtt.methodsecond;

import com.mqtt.nettymqtt.entity.Mqtt;
import com.mqtt.nettymqtt.mapper.MqttMapper;
import com.mqtt.nettymqtt.utils.ContextUtil;
import com.mqtt.nettymqtt.utils.JdbcUtil;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.DependsOn;
import org.springframework.context.annotation.Import;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;


/**
 * @author ln
 * @Description: ${todo}
 * @date 2020/12/1
 */
public class PushCallback implements MqttCallback {

//运行MQTTClient里的main()，它并没有启动springboot程序，setApplicationContext这个方法是项目启动的时候才会执行
//    所以getApplicationContext()会出现null
//    private MqttMapper mqttMapper=ContextUtil.getBean(MqttMapper.class);

//    同理，由于springboot项目并没有启动起来，所以MqttMapper会注入失败
    @Autowired
    private MqttMapper mqttMapper;

    //    在断开连接时调用
    @Override
    public void connectionLost(Throwable throwable) {
// 连接丢失后，一般在这里面进行重连
        System.out.println("连接断开，可以做重连");
    }

    //    接收已经预订的发布。
    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {
// subscribe后得到的消息会执行到这里面
//        特别注意一下，messageArrived这个里面不允许调用代码和写方法，如果调用就会断开连接这个是个坑，
//        然后用我这个try{}catch{}就没有问题了，就不会再去掉线断开连接
        System.out.println("接收消息主题 : " + topic);
        System.out.println("接收消息Qos : " + message.getQos());
        System.out.println("接收消息内容 : " + new String(message.getPayload()));
        try {
            Mqtt mqtt = new Mqtt();
//            mqtt.setId(message.getId());
            mqtt.setMessage(new String(message.getPayload()));

            JdbcUtil.save(message.getId(),new String(message.getPayload()));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //    接收到已经发布的 QoS 1 或 QoS 2 消息的传递令牌时调用。
//    由 MqttClient.connect 激活此回调。
    @Override
    public void deliveryComplete(IMqttDeliveryToken token) {
        System.out.println("deliveryComplete---------" + token.isComplete());
    }


}
